package com.pine.common.util.valid;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.validation.BeanValidationResult;
import cn.hutool.extra.validation.ValidationUtil;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 校验工具
 *
 * @author pine manage
 * @since 2024-10-18
 */
public class ValidUtil {

    /**
     * 校验数据列表
     *
     * @param dataList      待校验对象
     * @param group     校验分组：比如，{@link Create},{@link Update}
     * @return 校验通过返回null, 校验不通过返回错误信息
     */
    public static <T> String validate(List<T> dataList, Class<?> ...group) {
        if (CollUtil.isEmpty(dataList)) {
            return null;
        }

        // 校验数据
        Optional<BeanValidationResult> validationResultOptional = dataList.parallelStream()
                .map(data -> ValidationUtil.warpValidate(data, group))
                .filter(result -> !result.isSuccess())
                .findAny();

        // 校验通过
        if (validationResultOptional.isEmpty()) {
            return null;
        }

        // 校验失败
        BeanValidationResult result = validationResultOptional.get();
        // 获取错误信息,逗号拼接
        String errorMsg = result.getErrorMessages().stream().map(BeanValidationResult.ErrorMessage::getMessage).collect(Collectors.joining(","));
        // 截取前1000个字符
        return StrUtil.maxLength(errorMsg, 1000);
    }
}
